home *** CD-ROM | disk | FTP | other *** search
- /******************** ***********************/
- //
- // Player PRO 4.4x -- APPL to MADx & MADx to APPL
- //
- // Version 1.0 - 12.3.95 ANR
- //
- // To use with CodeWarrior 68K or PPC
- //
- // Antoine ROSSET
- // 16 Tranchees
- // 1206 GENEVA
- // SWITZERLAND
- //
- // FAX: (+41 22) 346 11 97
- // Compuserve: 100277,164
- // Internet: rosset@dial.eunet.ch
- //
- /******************** ***********************/
-
- #include "MOD.h"
- #include "MAD.h"
- #include "RDriver.h"
- #include "PPInOut.h"
-
- #if defined(powerc) || defined(__powerc)
- enum {
- PlayerPROPlug = kCStackBased
- | RESULT_SIZE(SIZE_CODE(sizeof(OSErr)))
- | STACK_ROUTINE_PARAMETER(1, SIZE_CODE(sizeof( OSType)))
- | STACK_ROUTINE_PARAMETER(2, SIZE_CODE(sizeof( Ptr*)))
- | STACK_ROUTINE_PARAMETER(3, SIZE_CODE(sizeof( MADPartition*)))
- | STACK_ROUTINE_PARAMETER(4, SIZE_CODE(sizeof( PPInfoRec*)))
- | STACK_ROUTINE_PARAMETER(5, SIZE_CODE(sizeof( short**)))
- };
-
- ProcInfoType __procinfo = PlayerPROPlug;
- #else
- #include <A4Stuff.h>
- #endif
-
- void pStrcpy(register unsigned char *s1, register unsigned char *s2)
- {
- register short len, i;
-
- len = *s2;
- for ( i = 0; i <= len; i++) s1[ i] = s2[ i];
- }
-
- OSErr LoadMADF( Ptr MADPtr, MADPartition *MadFile)
- {
- short i, maxInstru;
- long inOutCount, OffSetToSample;
- struct PatHeader tempPatHeader;
- MADSpec *MadHeader;
-
- /**** HEADER ****/
- MadFile->header = (MADSpec*) NewPtr( sizeof( MADSpec));
- if( MadFile->header == 0L) return needMoreMemory;
-
- OffSetToSample = 0L;
- BlockMove( MADPtr, MadFile->header, sizeof( MADSpec));
- OffSetToSample += sizeof( MADSpec);
-
- MadHeader = MadFile->header;
-
- if( MadHeader->MADIdentification != 'MADG') return fileNotSupportedByThisPlug;
-
- /**** PARTITION ****/
- for( i = MadHeader->PatMax; i < MAXPATTERN; i++) MadFile->partition[ i] = 0L;
- for( i = 0; i < MadHeader->PatMax; i++)
- {
- inOutCount = sizeof( struct PatHeader);
- BlockMove( MADPtr + OffSetToSample, &tempPatHeader, inOutCount);
-
- inOutCount = sizeof( struct MusicPattern) + MadHeader->Tracks * tempPatHeader.PatternSize * sizeof( struct Command);
- MadFile->partition[ i] = (struct MusicPattern*) NewPtr( inOutCount);
- if( MadFile->partition[ i] == 0L) return needMoreMemory;
-
- BlockMove( MADPtr + OffSetToSample, MadFile->partition[ i], inOutCount);
- OffSetToSample += inOutCount;
- }
-
- /**** INSTRUMENTS ****/
- maxInstru = MAXINSTRU;
- for( i = 0; i < maxInstru ; i++)
- {
- if( MadHeader->fid[i].insSize > 0)
- {
- inOutCount = MadHeader->fid[i].insSize;
-
- MadFile->instrument[i] = NewPtr( inOutCount);
- if( MadFile->instrument[i] == 0L) return needMoreMemory;
-
- BlockMove( MADPtr + OffSetToSample, MadFile->instrument[ i], inOutCount);
- OffSetToSample += inOutCount;
- }
- else MadFile->instrument[i] = 0L;
- }
- /*********************/
- return( noErr);
- }
-
- OSErr TESTMADF( MADSpec* MADPtr)
- {
- if( MADPtr->MADIdentification == 'MADG') return noErr;
- else return fileNotSupportedByThisPlug;
- }
-
- OSErr INFOMADF( MADSpec* MADPtr, PPInfoRec *info)
- {
- short i;
-
- CtoPstr( MADPtr->NameSignature);
- pStrcpy( info->internalFileName, (unsigned char*) MADPtr->NameSignature);
- PtoCstr( (unsigned char*) MADPtr->NameSignature);
-
- pStrcpy( info->formatDescription, "\pMADG Resource (APPL)");
-
- info->totalPatterns = MADPtr->PatMax;
- info->partitionLength = MADPtr->numPointers;
-
- info->totalTracks = MADPtr->Tracks;
- info->signature = MADPtr->MADIdentification;
-
- info->totalInstruments = 0;
-
- for( i = 0; i < MAXINSTRU ; i++)
- {
- if( MADPtr->fid[i].insSize > 0) info->totalInstruments++;
- }
-
- return noErr;
- }
-
- void TurnRadio( short item, DialogPtr dlog, Boolean alors)
- {
- Handle itemHandle;
- short itemType;
- Rect itemRect;
-
- GetDItem (dlog, item, &itemType, &itemHandle, &itemRect);
-
- if( alors) SetCtlValue( (ControlHandle) itemHandle, 255);
- else SetCtlValue( (ControlHandle) itemHandle, 0);
- }
-
- short ChooseCompilation()
- {
- short itemHit, result;
- DialogPtr aDialog;
-
- aDialog = GetNewDialog( 173, 0L, (WindowPtr) -1L);
- SetPort( aDialog);
-
- SetDialogDefaultItem( aDialog, 1);
-
- ShowWindow( aDialog);
-
- TurnRadio( 6, aDialog, true);
- result = 6;
-
- do
- {
- ModalDialog( 0L, &itemHit);
-
- switch( itemHit)
- {
- case 4:
- case 5:
- case 6:
- TurnRadio( result, aDialog, false);
- TurnRadio( itemHit, aDialog, true);
- result = itemHit;
- break;
- }
-
- }while( itemHit != 1 && itemHit != 2);
-
- DisposDialog( aDialog);
-
- if( itemHit == 2) return -1;
-
- result -= 4;
- return result;
- }
-
- void CopyResource( OSType type, short ID, short newID)
- {
- Handle hRsrc;
-
- hRsrc = GetResource( type, ID); DetachResource( hRsrc);
- AddResource( hRsrc, type, newID, "\p"); WriteResource( hRsrc);
- DetachResource( hRsrc); DisposHandle( hRsrc);
- }
-
- OSErr SaveMODAPPL( short APPLType, short fRefNum, MADPartition *MadFile)
- {
- OSErr iErr;
- short i;
- long fileSize, inOutCount, tt;
- Handle hRsrc;
-
- fileSize = sizeof( MADSpec);
- for( i = 0; i < MadFile->header->PatMax; i++) fileSize += sizeof( struct PatHeader) + MadFile->header->Tracks * MadFile->partition[ i]->header.PatternSize * sizeof( struct Command);
- for( i = 0; i < MAXINSTRU ; i++) fileSize += MadFile->header->fid[i].insSize;
-
- hRsrc = NewHandle( fileSize);
- if( hRsrc == 0L) return needMoreMemory;
-
- tt = 0L;
- HLock( hRsrc);
-
- inOutCount = GetPtrSize( (Ptr) MadFile->header);
- BlockMove( MadFile->header, (*hRsrc), inOutCount);
- tt += inOutCount;
-
- for( i = 0; i < MadFile->header->PatMax ; i++)
- {
- MadFile->partition[ i]->header.CompressionMode = 'NONE';
- inOutCount = sizeof( struct PatHeader) + MadFile->header->Tracks * MadFile->partition[ i]->header.PatternSize * sizeof( struct Command);
- BlockMove( (Ptr) MadFile->partition[ i], (*hRsrc) + tt, inOutCount);
- tt += inOutCount;
- }
-
- for( i = 0; i < MAXINSTRU ; i++)
- {
- inOutCount = MadFile->header->fid[i].insSize;
- if( inOutCount > 0)
- {
- if( (*hRsrc) + inOutCount > (*hRsrc) + fileSize) DebugStr("\pSaveMOD ERROR");
-
- BlockMove( MadFile->instrument[ i], (*hRsrc) + tt, inOutCount);
- tt += inOutCount;
- }
- }
-
- HUnlock( hRsrc);
-
- SetHandleSize( hRsrc, tt);
-
- AddResource( hRsrc, 'MADF', 3214, "\p");
- WriteResource( hRsrc);
- DetachResource( hRsrc);
- DisposHandle( hRsrc);
-
- /**** On copie les ressources nécessaires pour l'application **/
-
- if( APPLType == 0 || APPLType == 2)
- {
- CopyResource( 'CODE', 100, 0);
- CopyResource( 'CODE', 101, 1);
- CopyResource( 'CODE', 102, 2);
- CopyResource( 'CODE', 103, 3);
- CopyResource( 'DREL', 100, 0);
- CopyResource( 'ZERO', 100, 0);
- CopyResource( 'DATA', 100, 0);
- }
-
- CopyResource( 'BGGB', 128, 128); // In PlayerPRO !!
- CopyResource( 'ALRT', 3215, 3215);
- CopyResource( 'DITL', 3215, 3215);
- CopyResource( 'DITL', 3214, 3214);
- CopyResource( 'DLOG', 3214, 3214);
- CopyResource( 'dctb', 3214, 3214);
- CopyResource( 'Prou', 0, 0);
- CopyResource( 'FREF', 228, 128);
- CopyResource( 'FREF', 229, 129);
- CopyResource( 'FREF', 230, 130);
- CopyResource( 'BNDL', 228, 128);
- CopyResource( 'WDEF', 205, 200);
- CopyResource( 'PICT', 140, 140);
- CopyResource( 'MENU', 228, 128);
- CopyResource( 'MDEF', 260, 260);
-
-
- CopyResource( 'icl8', 228, 128);
- CopyResource( 'ICN#', 228, 128);
- CopyResource( 'ics#', 128, 128);
-
- hRsrc = GetResource( 'SIZE', 99); DetachResource( hRsrc);
- AddResource( hRsrc, 'SIZE', -1, "\p");
-
- fileSize = 400L * 1024L;
- *((long*)((*hRsrc)+2)) = (long) fileSize;
- *((long*)((*hRsrc)+6)) = (long) fileSize;
-
- WriteResource( hRsrc); DetachResource( hRsrc); DisposHandle( hRsrc);
-
- if( APPLType == 1 || APPLType == 2)
- {
- hRsrc = GetResource( 'XXXX', 128);
- inOutCount = SizeResource( hRsrc);
- DetachResource( hRsrc);
- HLock( hRsrc);
- iErr = FSWrite(fRefNum, &inOutCount, *hRsrc);
- HUnlock( hRsrc);
- DisposHandle( hRsrc);
-
- CopyResource( 'cfrg', 100, 0);
- }
-
- return noErr;
- }
-
- /*****************/
- /* MAIN FUNCTION */
- /*****************/
-
- OSErr main( OSType order, FSSpec *AlienFileFSSpec, MADPartition *MadFile, PPInfoRec *info, short *MADpitchTable)
- {
- OSErr myErr;
- short vRefNum, iFileRefI;
- long dirID;
- Handle myRes;
-
- #ifndef powerc
- long oldA4 = SetCurrentA4(); //this call is necessary for strings in 68k code resources
- #endif
-
- HGetVol( 0L, &vRefNum, &dirID);
- HSetVol( 0L, AlienFileFSSpec->vRefNum, AlienFileFSSpec->parID);
-
- myErr = noErr;
-
- switch( order)
- {
- case 'IMPL':
- iFileRefI = OpenResFile( AlienFileFSSpec->name);
- if( iFileRefI == -1) myErr = unknowError;
- else
- {
- UseResFile( iFileRefI);
-
- if( Count1Resources( 'MADF') > 0)
- {
- myRes = Get1IndResource( 'MADF', 1);
- DetachResource( myRes);
- HLock( myRes);
-
- myErr = LoadMADF( *myRes, MadFile);
-
- HUnlock( myRes);
- DisposHandle( myRes);
- }
- else myErr = unknowError;
-
- CloseResFile( iFileRefI);
- }
- break;
-
- case 'TEST':
- iFileRefI = OpenResFile( AlienFileFSSpec->name);
- if( iFileRefI == -1) myErr = unknowError;
- else
- {
- UseResFile( iFileRefI);
-
- if( Count1Resources( 'MADF') > 0)
- {
- myRes = Get1IndResource( 'MADF', 1);
- DetachResource( myRes);
- HLock( myRes);
-
- myErr = TESTMADF( (MADSpec*) *myRes);
-
- HUnlock( myRes);
- DisposHandle( myRes);
- }
- else myErr = unknowError;
-
- CloseResFile( iFileRefI);
- }
- break;
-
- case 'EXPL':
- {
- short APPLType;
- short fRefNum;
-
- APPLType = ChooseCompilation();
- if( APPLType == -1) break;
-
- FSDelete( AlienFileFSSpec->name, 0);
- Create( AlienFileFSSpec->name, 0, 'Prou', 'APPL');
- myErr = FSOpen( AlienFileFSSpec->name, 0, &fRefNum);
- if( myErr == noErr)
- {
- CreateResFile( AlienFileFSSpec->name);
- iFileRefI = OpenResFile( AlienFileFSSpec->name);
- if( iFileRefI == -1) myErr = unknowError;
- else
- {
- UseResFile( iFileRefI);
-
- myErr = SaveMODAPPL( APPLType, fRefNum, MadFile);
-
- CloseResFile( iFileRefI);
- }
- FSClose( fRefNum);
- }
- }
- break;
-
- case 'INFO':
- iFileRefI = OpenResFile( AlienFileFSSpec->name);
- if( iFileRefI == -1) myErr = unknowError;
- else
- {
- UseResFile( iFileRefI);
-
- if( Count1Resources( 'MADF') > 0)
- {
- myRes = Get1IndResource( 'MADF', 1);
- info->fileSize = SizeResource( myRes);
-
- DetachResource( myRes);
- HLock( myRes);
-
- myErr = INFOMADF( (MADSpec*) *myRes, info);
-
- HUnlock( myRes);
- DisposHandle( myRes);
- }
- else myErr = unknowError;
-
- CloseResFile( iFileRefI);
- }
- break;
-
- default:
- myErr = orderNotImplemented;
- break;
- }
-
- HSetVol( 0L, vRefNum, dirID);
-
- #ifndef powerc
- SetA4( oldA4);
- #endif
- return myErr;
- }